package org.wmq.taskschedule.algorithm;

import org.opencv.core.Mat;
import org.opencv.core.Core;

/**
 * 图像对比度调整算法执行器
 * 实现AlgorithmExecutor接口，用于调整图像的对比度和亮度
 */
public class ContrastAdjustmentExecutor implements AlgorithmExecutor {

    private double alpha; // 对比度系数（1.0-3.0）
    private double beta; // 亮度增量（0-100）
    private String description; // 算法描述

    /**
     * 默认构造函数，使用默认参数
     */
    public ContrastAdjustmentExecutor() {
        this.alpha = 1.0;
        this.beta = 0;
        this.description = "图像对比度调整算法 - 调整图像的对比度和亮度";
    }

    /**
     * 构造函数，允许自定义参数
     * 
     * @param alpha 对比度系数（1.0-3.0）
     * @param beta 亮度增量（0-100）
     */
    public ContrastAdjustmentExecutor(double alpha, double beta) {
        if (alpha < 0 || beta < -255 || beta > 255) {
            throw new IllegalArgumentException("对比度系数必须大于0，亮度增量必须在[-255, 255]范围内");
        }
        this.alpha = alpha;
        this.beta = beta;
        this.description = "图像对比度调整算法 - 调整图像的对比度和亮度";
    }

    /**
     * 构造函数，允许自定义所有参数
     * 
     * @param alpha 对比度系数（1.0-3.0）
     * @param beta 亮度增量（0-100）
     * @param description 算法描述
     */
    public ContrastAdjustmentExecutor(double alpha, double beta, String description) {
        if (alpha < 0 || beta < -255 || beta > 255) {
            throw new IllegalArgumentException("对比度系数必须大于0，亮度增量必须在[-255, 255]范围内");
        }
        this.alpha = alpha;
        this.beta = beta;
        this.description = description;
    }

    @Override
    public Mat execute(Mat input) {
        if (input == null || input.empty()) {
            throw new IllegalArgumentException("输入图像不能为空");
        }

        // 创建输出图像
        Mat output = new Mat();

        // 应用对比度和亮度调整
        // 公式：output = alpha * input + beta
        input.convertTo(output, -1, alpha, beta);

        return output;
    }

    // Getters and setters
    public double getAlpha() {
        return alpha;
    }

    public void setAlpha(double alpha) {
        if (alpha < 0) {
            throw new IllegalArgumentException("对比度系数必须大于0");
        }
        this.alpha = alpha;
    }

    public double getBeta() {
        return beta;
    }

    public void setBeta(double beta) {
        if (beta < -255 || beta > 255) {
            throw new IllegalArgumentException("亮度增量必须在[-255, 255]范围内");
        }
        this.beta = beta;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}